package com.solution;

import java.util.ArrayList;
import java.util.List;

/**
 * 给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。
 *
 * 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。
 *
 * 示例:
 *
 * 输入："23"
 * 输出：["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
 * 说明:
 * 尽管上面的答案是按字典序排列的，但是你可以任意选择答案输出的顺序。
 *
 * @author LiYongKui
 * @version 1.0
 * @date 2021/1/22 14:14
 */
public class Solution0017 {

    public static List<String> letterCombinations(String digits) {
        List<String> result = new ArrayList<>();
        if(digits == null || "".equals(digits)){
            return result;
        }
        String[] arr = {"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        backtrack(result,arr,digits,0,new StringBuilder());
        return result;
    }

    private static void backtrack(List<String> result, String[] arr, String digits, int i, StringBuilder stringBuilder) {
        if(i == digits.length()){
            result.add(stringBuilder.toString());
            return;
        }
        int idx = digits.charAt(i)-'0';
        if(idx < 2){
            return;
        }
        for (int j = 0; j < arr[idx-2].length(); j++) {
            stringBuilder.append(arr[idx-2].charAt(j));
            backtrack(result,arr,digits,i+1,stringBuilder);
            stringBuilder.deleteCharAt(i);
        }
    }

    public static void main(String[] args) {
        System.out.println(letterCombinations("23"));
    }
}
